# 《小型支付商城系统》第1-1节 DDD 架构概念

作者:小傅哥
博客:https://bugstack.cn (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!😄

# 第1节:DDD 架构概念

DDD 是什么,这应该是每个想使用 DDD 开发项目的研发伙伴,遇到的第一个疑问,只有搞清楚它到底是什么才好上手使用。而 DDD 既不是 MVC 一样的工程结构,也不能直接等同于微服务架构,更不是一种设计模式。

# 1. DDD 是什么

那 DDD 是什么呢?来自于维基百科的一段定义:"Domain-driven design (DDD) is a major software design approach. " (opens new window),DDD 是一种软件设计方法。也就是说 DDD 是指导我们做软件工程设计的一种手段,它提供了用切割工程模型的各类技巧,如;领域、界限上下文、实体、值对象、聚合、工厂、仓储等。通过 DDD 的指导思想,我们可以在前期投入更多的时间,更加合理的规划出可持续迭代的工程设计。

在 DDD 中有一套共识的工程两阶段设计手段,包括;战略设计、战术设计。

  • 战略设计,主要以应对复杂的业务需求,通过抽象、分治的过程,合理的拆分为独立的多个微服务,从而分而治之。与之评价拆分的是否合理,则是在需求开发上线时候,是否每次都大量操作多个微服务开发和上线。这样的战略设计是一种失败的微服务单体设计。所以少数几个中等规模的单体应用,周围环绕着一个服务生态系统,这更有意义。你实际上并没有构建微服务 @贾斯汀·埃瑟里奇 (opens new window)

  • 战术设计,在这个范畴下,主要以讨论如何基于面向对象思维,运用领域模型来表达业务概念。通常在不做领域模型设计的架构,也就是通常映射到 MVC 三层架构下,Service + 数据模型的开发模式,会让 Service 扁平的、大量的,平铺出非常复杂的业务逻辑代码。再加上行为对象与功能逻辑的分离,贫血模型的开发方式,让行为对象的不断交叉使用,也是让系统不断增加复杂度,并到难以维护的根因。所以这一阶段要设计每一个可以表达领域概念的模型,并运用实体、聚合、领域服务来承载。

# 2. DDD 的概念

什么是充血模型,领域内都包括什么,实体、聚合、值对象,有什么区别?这样一些"为什么"的概念,也是战术设计过程中非常重要的知识项。搞清楚它们才能做 DDD 设计。

# 2.1 充血模型

充血模型,指将对象的属性信息与行为逻辑聚合到一个类中,常用的手段如在对象内提供属于当前对象的信息校验拼装缓存Key不含服务接口调用的逻辑处理等。

  • 这样的方式可以在使用一个对象时,就顺便拿到这个对象的提供的一系列方法信息,所有使用对象的逻辑方法,都不需要自己再次处理同类逻辑。
  • 但不要只是把充血模型,仅限于一个类的设计和一个类内的方法设计。充血还可以是整个包结构,一个包下包括了用于实现此包 Service 服务所需的各类零部件(模型、仓储、工厂),也可以被看做充血模型。
  • 同时我们还会再一个同类的类下,提供对应的内部类,如用户实名,包括了,通信类、实名卡、银行卡、四要素等。它们都被写进到一个用户类下的内部子类,这样在代码编写中也会清晰的看到子类的所属信息,更容易理解代码逻辑,也便于维护迭代。